package top.infopub.common;


import java.util.HashMap;
import java.util.Map;

import top.infopub.vo.ResponseVo;


/**
 * 请严格准命名规范
 * ERROR_系统代号_错误类型 <br />
 * @author Awoke
 * @version 2018年9月18日
 * @see ErrorCodeEnum
 * @since
 */
public enum ErrorCodeEnum {

    //---1x---//
    /**
     * 1001,"参数不符合规则"
     */
    ERROR_COMMON_PARAM(1001, "参数不符合规则~"),
    /**
     * 1002,"系统数据异常~" 
     */
    ERROR_COMMON_SYSTEM(1002, "系统数据异常~"),
    /**
     * 1003,"系统处理中"
     */
    ERROR_COMMON_HANDING(1003, "系统处理中~"),
    /**
     * 1004,"保存数据失败"
     */
    ERROR_COMMON_SAVE(1004, "保存数据失败~"),
    /**
     * 1005,"违反了唯一约束"
     */
    ERROR_COMMON_UNIQUE(1005, "违反唯一约束~"),
    /**
     * 1006,"条件验证异常"
     */
    ERROR_COMMON_CHECK(1006, "条件验证异常~"),
    /**
     * 1007,"重复处理"
     */
    ERROR_COMMON_REPEAT_HANDLER(1007, "重复处理~"),
    /**
     * 1008,"网络超时"
     */
    ERROR_COMMON_NETWORK_ERROR(1008, "网络超时~"),
    /**
     * 1009,"编号已经存在"
     */
    ERROR_COMMON_CODE_UK(1009, "编号已经存在~"),

    //---2x---//
    /**
     * 2001,"模板信息有误"
     */
    ERROR_MGC_TEMPLATE(2001, "模板信息有误~"),
    /**
     * 2002,"模板生成HTML出错"
     */
    ERROR_MGC_TEMPLATE_GEN_HTML(2002, "模板生成HTML出错~"),
    /**
     * 2003,"模板生成PDF出错"
     */
    ERROR_MGC_TEMPLATE_GEN_PDF(2003, "模板生成PDF出错~"),
    /**
     * 2004, "PDF文件不存在~"
     */
    ERROR_MGC_PDF_NO_EXIST(2004, "PDF文件不存在~"),
    /**
     * 2005, "获取PDF文件流出错~"
     */
    ERROR_MGC_PDF_STREAM(2005, "获取PDF文件流出错~"),
    /**
     * 2013,"发送邮件错误"
     */
    ERROR_MGC_SENDMAIL(2013, "发送邮件错误~"),
    /**
     * 2014,"发送短信错误"
     */
    ERROR_MGC_SENDSMS(2014, "发送短信错误~"),
    /**
     * 2015,"不允许批量发送短信"
     */
    ERROR_MGC_MULTI_PHONES(2015, "不允许批量发送短信~"),

    //---3x---//
    /**
     * 3001, "调度异常"
     */
    ERROR_JOB_SCHEDULER(3001, "调度任务异常~"),
    /**
     * 3002, "找不到对应的job实例"
     */
    ERROR_JOB_NOT_FOUND(3002, "找不到对应的job实例~"),

    //---4x---//
    /**
     * 4001, "生成用户标识和印章数据出错~"
     */
    ERROR_ESIGN_ACCOUNT_SEAL(4001, "生成用户标识和印章数据出错~"),
    /**
     * 4002, "电子签名出错~"
     */
    ERROR_ESIGN_OCCUR(4002, "电子签名出错~"),
    /**
     * 4003, "电子存证出错~"
     */
    ERROR_ESAVE_OCCUR(4003, "电子存证出错~"),

    //---5x---//
    /**
     * 5001, "无效的请求，请稍后再试~" 
     */
    ERROR_APP_REQ_ILLEGAL(5001, "无效的请求，请稍后再试~"),
    /**
     * 5002, "服务有点忙，请稍后再试~"
     */
    ERROR_APP_RSP_TIMEOUT(5002, "服务有点忙，请稍后再试~"),
    /**
     * 5003, "请求频繁，请稍后再试~"
     */
    ERROR_APP_REQ_OFTEN(5003, "请求频繁，请稍后再试~"),
    /**
     * 5004, "当前版本已不支持，请升级至最新版本~"
     */
    ERROR_APP_VERSION_OBSOLETED(5004, "当前版本已不支持，请升级至最新版本~"),
    /**
     * 5005, "当前登录失效，请重新登录~"
     */
    ERROR_APP_LOGIN_INVALID(5005, "当前登录失效，请重新登录~");

    private int code;

    private String returnMsg;

    ErrorCodeEnum(int code, String returnMsg) {
        this.code = code;
        this.returnMsg = returnMsg;
    }

    /**
     * Enum对应的ResponseVo，isSuccess=false
     * @return 
     * @see
     */
    @SuppressWarnings("rawtypes")
    public ResponseVo getResponseVo() {
        return new ResponseVo(false, this.code, this.returnMsg);
    }

    /**
     * Enum对应的ResponseVo，msg可以自定义，isSuccess=false
     * @return 
     * @see
     */
    @SuppressWarnings("rawtypes")
    public ResponseVo getResponseVo(String msg) {
        return new ResponseVo(false, this.code, msg);
    }

    public static String getMsgByCode(int code) {
        synchronized (lock) {
            if (params == null) {
                params = new HashMap<Integer, ErrorCodeEnum>();
                for (ErrorCodeEnum e : ErrorCodeEnum.values()) {
                    params.put(e.code, e);
                }
            }
        }
        return params.get(code).returnMsg;
    }

    public static ErrorCodeEnum getEnumByCode(int code) {
        synchronized (lock) {
            if (params == null) {
                params = new HashMap<Integer, ErrorCodeEnum>();
                for (ErrorCodeEnum e : ErrorCodeEnum.values()) {
                    params.put(e.code, e);
                }
            }
        }
        return params.get(code);
    }

    private static Map<Integer, ErrorCodeEnum> params;

    private static Object lock = new Object();

    public int getCode() {
        return this.code;
    }

}
